"""
用户服务依赖注入容器
=====================

继承RedFire统一容器，获得标准化基础设施，专注业务逻辑。
"""

from functools import partial
from dependency_injector import providers
from redfire_framework.core.container import RedFireContainer

from .repositories.user_repository import UserRepository
from .services.user_service import UserService
from .services.audit_service import AuditService
from .services.transaction_service import TransactionService


class UserServiceContainer(RedFireContainer):
    """
    用户服务依赖注入容器
    
    继承RedFireContainer，获得：
    - 统一配置管理 (config)
    - 数据库管理 (database_manager)
    - 安全服务 (security_service)
    - 日志服务 (logger_service)
    
    只需定义业务特有的服务。
    """
    
    # 创建专用的会话工厂，指定使用 "user_primary" 数据库
    # 使用 Callable provider 来创建一个包装函数
    user_primary_session_factory = providers.Callable(
        lambda db_manager: partial(db_manager.get_session, "user_primary"),
        db_manager=RedFireContainer.database_manager
    )
    
    # 仓储层 - 注入数据库路由器，支持读写分离
    user_repository = providers.Factory(
        UserRepository,
        session_factory=user_primary_session_factory
    )
    
    # 事务服务
    transaction_service = providers.Factory(
        TransactionService,
        session_factory=user_primary_session_factory
    )
    
    # 业务服务层
    # 使用Factory而不是从config中获取，因为config只包含基础配置
    audit_service = providers.Singleton(
        lambda: AuditService(config={"enabled": True, "retention_days": 90})
    )
    
    # JWT管理器 - 从安全服务获取
    jwt_manager = providers.Factory(
        lambda security_service: security_service.jwt_manager,
        security_service=RedFireContainer.security_service
    )
    
    user_service = providers.Factory(
        UserService,
        user_repository=user_repository,
        transaction_service=transaction_service,
        jwt_manager=jwt_manager,
        password_manager=RedFireContainer.security_service.provided.password_manager,
        audit_service=audit_service
    )
